package com.newtouch.bxzs.common.base.util;

import com.newtouch.bxzs.common.base.BaseException;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 个单查询条件--长度验证 和格式验证
 *
 * <p>
 * <b>History:</b>
 * <table border="1">
 * <tr>
 * <th>Date</th>
 * <th>Operator</th>
 * <th>Memo</th>
 * </tr>
 * <tr>
 * <td>2021/2/3 9:34</td>
 * <td>linhongxi</td>
 * <td>Create</td>
 * </tr>
 * </table>
 *
 * @author linhongxi
 * @version 1.0.0
 * @since 1.0.0
 */
public class NumberLengthCheckUtils {

	/** 只允许用户输入数字1-9,字母a-z,A-Z,只能半角,不能有空格的正则表达式 */
	private static final String ONLY_LETTER_OR_NUMBER = "^[a-z0-9A-Z]+$";

	/** 判断字符串中是否包含中文正则表达式 */
	private static final String JUDGE_CHINESE = "[\\u4e00-\\u9fa5]";

	/** 判断字符串中是否包含特殊字符 */
	private static final String SPECIAL_CHARACTERS = "[ _`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~！@#￥%……&*（）——+|{}【】‘；：”“’。，、？]|\n|\r|\t";

	/** 不允许用户输入包含“有限公司”的公司名称 */
	private static final String LIMITED_COMPANY = "有限公司";

	/** 不允许用户输入包含“责任公司”的公司名称 */
	private static final String RESPONSIBILITY_COMPANY = "责任公司";

	/** 不允许用户输入包含“有限责任公司”的公司名称 */
	private static final String LIMITED_LIABILITY_COMPANY = "有限责任公司";

	/**
	 * 校验保单号或投保单号只能为字母或者数字，且长度不超过30字符
	 */
	public static void formatValidation(String number) {
		// 对用户输入的String做校验只允许有数字和大小写字母、不允许全角,只允许半角
		boolean result = number.matches(ONLY_LETTER_OR_NUMBER);
		if (!result) {
			throw new BaseException("-1", "录入单号只能是数字或字母");
		}
	}

	/**
	 * 校验录入信息长度是否超过30个字符
	 */
	public static void lengthCheck(String information) {
		if (information.length() > 30) {
			throw new BaseException("-1", "录入信息超过30字符");
		}
	}

	/**
	 * 校验录入投保公司名称
	 */
	public static void companyNameCheck(String companyName) {
		if (isSpecialChar(companyName)) {
			throw new BaseException("-1", "投保公司名称不能包含特殊字符");
		}
		if (LIMITED_COMPANY.equals(companyName) || RESPONSIBILITY_COMPANY.equals(companyName)
				|| LIMITED_LIABILITY_COMPANY.equals(companyName)) {
			throw new BaseException("-1", "该名称不能作为投保公司名称查询");
		}
		if (characters(companyName) <= 4) {
			throw new BaseException("-1", "投保公司名称不能少于4个汉字");
		}
	}

	/**
	 * 判断是否含有特殊字符
	 */
	private static boolean isSpecialChar(String str) {
		Pattern p = Pattern.compile(SPECIAL_CHARACTERS);
		Matcher m = p.matcher(str);
		return m.find();
	}

	/**
	 * 判断字符串有几个汉字
	 */
	private static int characters(String str) {
		int count = 0;
		Pattern p = Pattern.compile(JUDGE_CHINESE);
		Matcher m = p.matcher(str);
		while (m.find()) {
			for (int i = 0; i <= m.groupCount(); i++) {
				count = count + 1;
			}
		}
		return count;
	}
}
